package design2.builder.example;

import design2.builder.example.builders.CarBuilder;
import design2.builder.example.builders.CarManualBuilder;
import design2.builder.example.cars.Car;
import design2.builder.example.cars.Manual;
import design2.builder.example.director.Director;

/**
 *  Demo class. Everything comes together here.
 */
public class Demo {
	/**
	 * TODO 具体的产品 以及产品的特性类中，没有set 方法，
	 * TODO 将set方法统一提取到builder类中
	 * TODO 由Director 主管类，决定构建的具体参数，构建什么样的产品
	 * @param args
	 */
	public static void main(String[] args) {

		//主管
		Director director=new Director();

		/**
		 * Director从客户机获取concrete builder对象
		 * （应用程序代码）。这是因为应用程序更清楚使用哪个构建器来获得特定的产品。
		 */
		//车辆构建类
		CarBuilder carBuilder=new CarBuilder();
		//车辆手册构建类
		CarManualBuilder carManualBuilder=new CarManualBuilder();


		director.constructSportsCar(carBuilder);
		director.constructSportsCar(carManualBuilder);

		//从构建类中获取跑车
		/**
		 * 最终产品通常从生成器对象中检索，因为Director不知道也不依赖于具体的生成器和产品。
		 */
		Car car=carBuilder.getResult();
		Manual manual=carManualBuilder.getResult();

		System.out.println("车辆类型："+car.getCarType());
		//Director 可能知道一些构建配方。
		System.out.println("车辆手册："+manual.print());

		//具体操作
		car.getEngine().on();
		car.getTripComputer().showStatus();
		car.getTripComputer().showFuelLevel();
	}
}
